package com.chris.core.socket.netty.handler;

import com.chris.core.socket.netty.util.NettyRunTimeUtil;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 自定义netty 客户端 handler
 */
public class StringClientHandler extends ChannelInboundHandlerAdapter {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    /**
     * 当通道就绪
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
       // super.channelActive(ctx);
       // ctx.writeAndFlush(Unpooled.copiedBuffer("建立链接\r\n", CharsetUtil.UTF_8));
        ctx.writeAndFlush("客户端建立链接"+ NettyRunTimeUtil.runTimeBreakMark);
       // ctx.writeAndFlush("ping\r\n");
       // log.info("客户端通道建立就绪 服务端地址:"+ctx.channel().remoteAddress());
    }

    /**
     * 读取服务端发送数据
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // super.channelRead(ctx,msg);

        //注意区别 ：byteBuffer(nio) ByteBuf (netty)
       // ByteBuf byteBuf =(ByteBuf)msg;
        //  log.debug("获取客户端发送数据：" +byteBuf.toString(CharsetUtil.UTF_8));
       // String tip= byteBuf.toString(CharsetUtil.UTF_8);

        //服务端发来  read-ping ,不回复pong , write-ping 回复pong
       // if (msg.equals("write-ping"))
       //     ctx.writeAndFlush("pong\r\n");
        String tip = (String)msg;
        log.debug("获取服务端送数据：" +msg.toString());

        //异步执行 read 内容
        ctx.channel().eventLoop().execute(new Runnable() {
            @Override
            public void run() {

            }
        });

        //传递给下一个pinline
        super.channelRead(ctx,msg);
    }

    /**
     * 异常处理
     * 一般是关闭通道
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
        log.debug("客户端通道捕获异常 客户端地址:"+ctx.channel().remoteAddress() +" 问题:"+cause.toString() ) ;
    }

    /**
     *通道下线
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        log.debug("客户端下线 地址："+channel.remoteAddress());
    }
}
